package com.bw.kf.playvideo

import com.google.gson.annotations.SerializedName
import java.text.SimpleDateFormat
import java.util.*

// 评论API响应根结构
data class CommentEntity(
    val code: Int,
    val msg: String,
    val `data`: List<CommentEntityItem>
)

// 评论项数据结构
data class CommentEntityItem(
    val id: Int,
    val datatype: Int,
    val itemid: String,
    val content: String,
    val userid: Int,
    val nickname: String,
    val userlogo: String,
    val createtime: String,
    var replytotal: Int,
    var agreenum: Int,
    var replyList: MutableList<CommentEntityItem>? = null,
    // 添加回复相关字段
    val parentId: Int? = null, // 父评论ID，null表示主评论
    val replyToUserId: Int? = null, // 回复的用户ID
    val replyToUserName: String? = null, // 回复的用户名
    // 添加一个字段来跟踪点赞状态
    var isLiked: Boolean = false,
    // 添加展开状态
    var isExpanded: Boolean = false,
    // 添加显示回复输入框状态
    var showReplyInput: Boolean = false,
    // 添加评论层级字段，用于支持多级评论
    var level: Int = 0, // 0表示主评论，1表示一级回复，2表示二级回复，以此类推
    // 添加根评论ID字段，用于标识评论树
    val rootCommentId: Int? = null // 最顶层评论的ID，null表示自己是根评论
) {
    // 获取时间戳用于排序
    fun getTimestamp(): Long {
        return try {
            val format = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
            format.parse(createtime)?.time ?: 0L
        } catch (e: Exception) {
            System.currentTimeMillis()
        }
    }
    
    // 格式化显示时间
    fun getFormattedTime(): String {
        return try {
            val format = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
            val displayFormat = SimpleDateFormat("MM-dd HH:mm", Locale.getDefault())
            val date = format.parse(createtime)
            date?.let { displayFormat.format(it) } ?: createtime
        } catch (e: Exception) {
            createtime
        }
    }
    
    // 添加回复到当前评论
    fun addReply(reply: CommentEntityItem) {
        if (replyList == null) {
            // 如果replyList为null，创建新的可变列表
            val mutableReplies = mutableListOf<CommentEntityItem>()
            mutableReplies.add(0, reply) // 新回复添加到顶部
        } else {
            replyList!!.add(0, reply) // 新回复添加到顶部
        }
    }
    
    // 获取所有回复（按时间倒序）
    fun getSortedReplies(): List<CommentEntityItem> {
        return replyList?.sortedByDescending { it.getTimestamp() } ?: emptyList()
    }
}

// 发送评论请求参数
data class SendCommentRequest(
    val datatype: Int,
    val itemid: String,
    val content: String,
    val parentId: Int? = null, // 父评论ID，用于回复
    val replyToUserId: Int? = null, // 回复的用户ID
    val replyToUserName: String? = null // 回复的用户名
)

// 发送评论响应
data class SendCommentResponse(
    val code: Int,
    val msg: String,
    val data: CommentEntityItem?
)

// 评论排序类型
enum class CommentSortType {
    TIME_DESC, // 按时间倒序（最新在前）
    TIME_ASC,  // 按时间正序（最旧在前）
    LIKE_DESC  // 按点赞数倒序
}

// 评论工具类
object CommentUtils {
    
    /**
     * 对评论列表进行排序
     */
    fun sortComments(comments: List<CommentEntityItem>, sortType: CommentSortType): List<CommentEntityItem> {
        return when (sortType) {
            CommentSortType.TIME_DESC -> comments.sortedByDescending { it.getTimestamp() }
            CommentSortType.TIME_ASC -> comments.sortedBy { it.getTimestamp() }
            CommentSortType.LIKE_DESC -> comments.sortedByDescending { it.agreenum }
        }
    }
    
    /**
     * 将新评论插入到列表顶部
     */
    fun insertNewComment(comments: MutableList<CommentEntityItem>, newComment: CommentEntityItem) {
        if (newComment.parentId == null) {
            // 主评论，插入到列表顶部
            comments.add(0, newComment)
        } else {
            // 回复评论，找到父评论并添加回复
            val parentComment = findCommentById(comments, newComment.parentId)
            parentComment?.addReply(newComment)
        }
    }
    
    /**
     * 根据ID查找评论
     */
    private fun findCommentById(comments: List<CommentEntityItem>, commentId: Int): CommentEntityItem? {
        for (comment in comments) {
            if (comment.id == commentId) {
                return comment
            }
            // 递归查找回复中的评论
            comment.replyList?.let { replies ->
                val found = findCommentById(replies, commentId)
                if (found != null) return found
            }
        }
        return null
    }
    
    /**
     * 获取评论总数（包括回复）
     */
    fun getTotalCommentCount(comments: List<CommentEntityItem>): Int {
        var count = comments.size
        comments.forEach { comment ->
            comment.replyList?.let { replies ->
                count += getTotalCommentCount(replies)
            }
        }
        return count
    }
}
